import { useTabStore } from '../store/tab';
import { useTitleStore } from '../store/title';
import { isMicroAppPath, getMicroAppTabSuffix } from './microAppHelper';

// 保存原始的document.title设置方法
const originalTitleDescriptor = Object.getOwnPropertyDescriptor(Document.prototype, 'title') || {
  get: () => document.title,
  set: (v) => { document.title = v; }
};

// 标题变更映射表，记录每个路径对应的标题
const pathTitleMap = new Map<string, string>();
let currentTitle = document.title;
let isUpdating = false;

// 当前活动路径和上一个活动路径
let currentActivePath = '';
let pendingTitleUpdate = false;
let pendingTitle = '';
let pendingPath = '';

// 防抖定时器
let debounceTimer: number | null = null;
const DEBOUNCE_DELAY = 50; // 50ms 防抖延迟

/**
 * 初始化标题观察器，监听document.title的变化并同步到当前标签页
 */
export function initTitleObserver() {
  // 重写document.title的setter，以便在标题变化时触发我们的逻辑
  Object.defineProperty(Document.prototype, 'title', {
    get: originalTitleDescriptor.get,
    set: function(value) {
      // 如果当前正在更新，避免循环调用
      if (isUpdating) {
        // 直接调用原始setter设置实际标题，但不触发我们的逻辑
        originalTitleDescriptor.set?.call(this, value);
        return;
      }
      
      // 记录新标题
      if (currentTitle !== value) {
        currentTitle = value;
        
        // 使用防抖处理标题更新
        if (debounceTimer) {
          clearTimeout(debounceTimer);
        }
        
        // 将标题更新推迟到下一个宏任务，确保路由变化已完全处理
        debounceTimer = window.setTimeout(() => {
          if (currentActivePath) {
            updateTabTitle(currentActivePath, value);
          }
          debounceTimer = null;
        }, DEBOUNCE_DELAY);
        
        // 调用原始setter设置实际标题
        originalTitleDescriptor.set?.call(this, value);
      } else {
        // 标题没变，直接调用原始setter
        originalTitleDescriptor.set?.call(this, value);
      }
    },
    configurable: true
  });
  
  // 监听子应用标题变化事件
  window.addEventListener('micro-app-title-change', ((event: CustomEvent) => {
    try {
      const { title, fullTitle, appName, path } = event.detail;
      console.log('[TitleObserver] Received title change from micro app:', title, path);
      
      // 构造完整路径
      const fullPath = path.startsWith('/') ? `/${appName}${path}` : `/${appName}/${path}`;
      
      // 更新标题映射
      if (title) {
        setPathTitle(fullPath, title);
      }
      
      // 如果是当前活动路径，立即更新document.title
      if (fullPath === currentActivePath) {
        isUpdating = true;
        try {
          document.title = fullTitle || title;
        } finally {
          isUpdating = false;
        }
      }
    } catch (e) {
      console.error('[TitleObserver] Error handling micro app title change:', e);
    }
  }) as EventListener);
  
  console.log('[TitleObserver] Title observer initialized');
}

/**
 * 设置当前活动路径
 */
export function setActivePath(path: string) {
  // 如果路径变化了，取消之前的待处理更新
  if (currentActivePath !== path && debounceTimer) {
    clearTimeout(debounceTimer);
    debounceTimer = null;
  }
  
  // 更新当前活动路径
  currentActivePath = path;
  
  // 如果有缓存的标题，立即应用到新标签
  const cachedTitle = pathTitleMap.get(path);
  if (cachedTitle) {
    // 使用setTimeout确保在标签已创建后更新
    setTimeout(() => {
      const tabStore = useTabStore();
      tabStore.updateTabTitle(path, cachedTitle);
    }, 0);
  }
}

/**
 * 更新指定路径的标签页标题
 */
function updateTabTitle(path: string, title: string) {
  if (!path) return;
  
  try {
    // 标记为正在更新，避免循环调用
    isUpdating = true;
    
    // 获取tab store
    const tabStore = useTabStore();
    
    // 提取标题，如果有格式如 "页面名称 - 系统名称"，只取页面名称部分
    const titleParts = title.split(' - ');
    const pageTitle = titleParts[0];
    
    // 记录路径对应的标题
    pathTitleMap.set(path, pageTitle);
    
    // 更新标签的标题
    tabStore.updateTabTitle(path, pageTitle);
    
    // 如果是微应用路径，处理后缀
    if (isMicroAppPath(path)) {
      // 获取微应用标签后缀
      const suffix = getMicroAppTabSuffix(path);
      if (suffix) {
        // 更新标题存储中的后缀
        const titleStore = useTitleStore();
        titleStore.setSuffix(suffix);
      }
    }
    
    console.log(`[TitleObserver] Updated title for path ${path} to "${pageTitle}"`);
  } finally {
    // 完成更新，重置标志
    isUpdating = false;
  }
}

/**
 * 清理标题观察器
 */
export function cleanupTitleObserver() {
  // 清除防抖定时器
  if (debounceTimer) {
    clearTimeout(debounceTimer);
    debounceTimer = null;
  }
  
  // 恢复原始的title setter
  Object.defineProperty(Document.prototype, 'title', originalTitleDescriptor);
  
  // 移除事件监听器
  window.removeEventListener('micro-app-title-change', (() => {}) as EventListener);
  
  console.log('[TitleObserver] Title observer cleaned up');
}

/**
 * 获取指定路径的保存标题
 */
export function getPathTitle(path: string): string | undefined {
  return pathTitleMap.get(path);
}

/**
 * 手动设置路径标题，用于新创建的标签
 */
export function setPathTitle(path: string, title: string): void {
  pathTitleMap.set(path, title);
  
  // 如果是当前活动路径，立即更新标签
  if (path === currentActivePath) {
    const tabStore = useTabStore();
    tabStore.updateTabTitle(path, title);
  }
} 